using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._RasterAnalysisTools._Hydrology
{
    /// <summary>
    /// <para>Fill</para>
    /// <para>Fills sinks in a surface raster to remove small imperfections in the data.</para>
    /// <para>填充表面栅格中的水槽以移除数据中的小缺陷。</para>
    /// </summary>    
    [DisplayName("Fill")]
    public class Fill : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public Fill()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_inputSurfaceRaster">
        /// <para>Input Surface Raster</para>
        /// <para>The input raster representing a continuous surface.</para>
        /// <para>表示连续表面的输入栅格。</para>
        /// </param>
        /// <param name="_outputName">
        /// <para>Output Name</para>
        /// <para><xdoc>
        ///   <para>The name of the output fill raster service.</para>
        ///   <para>The default name is based on the tool name and the input layer name. If the layer name already exists, you will be prompted to provide another name.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出填充栅格服务的名称。</para>
        ///   <para>默认名称基于工具名称和输入图层名称。如果图层名称已存在，系统将提示您提供其他名称。</para>
        /// </xdoc></para>
        /// </param>
        public Fill(object _inputSurfaceRaster, object _outputName)
        {
            this._inputSurfaceRaster = _inputSurfaceRaster;
            this._outputName = _outputName;
        }
        public override string ToolboxName => "Raster Analysis Tools";

        public override string ToolName => "Fill";

        public override string CallName => "ra.Fill";

        public override List<string> AcceptEnvironments => ["cellSize", "extent", "mask", "outputCoordinateSystem", "snapRaster"];

        public override object[] ParameterInfo => [_inputSurfaceRaster, _outputName, _zLimit, _outputRaster];

        /// <summary>
        /// <para>Input Surface Raster</para>
        /// <para>The input raster representing a continuous surface.</para>
        /// <para>表示连续表面的输入栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Surface Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _inputSurfaceRaster { get; set; }


        /// <summary>
        /// <para>Output Name</para>
        /// <para><xdoc>
        ///   <para>The name of the output fill raster service.</para>
        ///   <para>The default name is based on the tool name and the input layer name. If the layer name already exists, you will be prompted to provide another name.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>输出填充栅格服务的名称。</para>
        ///   <para>默认名称基于工具名称和输入图层名称。如果图层名称已存在，系统将提示您提供其他名称。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Name")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _outputName { get; set; }


        /// <summary>
        /// <para>Z Limit</para>
        /// <para>Maximum elevation difference between a sink and its pour point to be filled.</para>
        /// <para>水槽与要填充的倾点之间的最大高程差。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Limit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _zLimit { get; set; } = null;


        /// <summary>
        /// <para>Output Raster</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Raster")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _outputRaster { get; set; }


        public Fill SetEnv(object cellSize = null, object extent = null, object mask = null, object outputCoordinateSystem = null, object snapRaster = null)
        {
            base.SetEnv(cellSize: cellSize, extent: extent, mask: mask, outputCoordinateSystem: outputCoordinateSystem, snapRaster: snapRaster);
            return this;
        }

    }

}